//
// Created by wxd on 2025/8/10.
//

#include "Cube.h"

glm::vec3 Cube::getCubeCenter() const {
    return m_CubeCenter;
}

Cube::Cube(float cubeWidth, glm::vec3 cubeCenter) {
    m_DrawMode = GL_TRIANGLES;
    m_GeometryType = GeometryType::TRIANGLE;
    m_DrawType = DrawType::DRAW_ELEMENTS;
    m_IndicesCount = 36;
    m_CubeWidth = cubeWidth;

    float halfSize = 0.5f * cubeWidth;

    m_CubeVertices = {
            // 前面
            glm::vec3(-halfSize, -halfSize,  halfSize),  // 0
            glm::vec3( halfSize, -halfSize,  halfSize),  // 1
            glm::vec3( halfSize,  halfSize,  halfSize),  // 2
            glm::vec3(-halfSize,  halfSize,  halfSize),  // 3

            // 后面
            glm::vec3(-halfSize, -halfSize, -halfSize),  // 4
            glm::vec3( halfSize, -halfSize, -halfSize),  // 5
            glm::vec3( halfSize,  halfSize, -halfSize),  // 6
            glm::vec3(-halfSize,  halfSize, -halfSize),  // 7

            // 左面
            glm::vec3(-halfSize, -halfSize, -halfSize),  // 8
            glm::vec3(-halfSize, -halfSize,  halfSize),  // 9
            glm::vec3(-halfSize,  halfSize,  halfSize),  // 10
            glm::vec3(-halfSize,  halfSize, -halfSize),  // 11

            // 右面
            glm::vec3( halfSize, -halfSize, -halfSize),  // 12
            glm::vec3( halfSize, -halfSize,  halfSize),  // 13
            glm::vec3( halfSize,  halfSize,  halfSize),  // 14
            glm::vec3( halfSize,  halfSize, -halfSize),  // 15

            // 下面
            glm::vec3(-halfSize, -halfSize, -halfSize),  // 16
            glm::vec3( halfSize, -halfSize, -halfSize),  // 17
            glm::vec3( halfSize, -halfSize,  halfSize),  // 18
            glm::vec3(-halfSize, -halfSize,  halfSize),  // 19

            // 上面
            glm::vec3(-halfSize,  halfSize, -halfSize),  // 20
            glm::vec3( halfSize,  halfSize, -halfSize),  // 21
            glm::vec3( halfSize,  halfSize,  halfSize),  // 22
            glm::vec3(-halfSize,  halfSize,  halfSize)   // 23
    };

    for (int i = 0; i < m_CubeVertices.size(); i++) {
        m_CubeVertices[i] += cubeCenter;
    }

    m_CubeColors = {
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,

        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,

        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,

        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,

        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,

        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,

        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
    };

    m_CubeTexCoords = {
        // 前面
        glm::vec2(0.0f, 0.0f),  // 0
        glm::vec2(1.0f, 0.0f),  // 1
        glm::vec2(1.0f, 1.0f),  // 2
        glm::vec2(0.0f, 1.0f),  // 3

        // 后面
        glm::vec2(0.0f, 0.0f),  // 4
        glm::vec2(1.0f, 0.0f),  // 5
        glm::vec2(1.0f, 1.0f),  // 6
        glm::vec2(0.0f, 1.0f),  // 7

        // 左面
        glm::vec2(0.0f, 0.0f),  // 8
        glm::vec2(1.0f, 0.0f),  // 9
        glm::vec2(1.0f, 1.0f),  // 10
        glm::vec2(0.0f, 1.0f),  // 11

        // 右面
        glm::vec2(0.0f, 0.0f),  // 12
        glm::vec2(1.0f, 0.0f),  // 13
        glm::vec2(1.0f, 1.0f),  // 14
        glm::vec2(0.0f, 1.0f),  // 15

        // 下面
        glm::vec2(0.0f, 0.0f),  // 16
        glm::vec2(1.0f, 0.0f),  // 17
        glm::vec2(1.0f, 1.0f),  // 18
        glm::vec2(0.0f, 1.0f),  // 19

        // 上面
        glm::vec2(0.0f, 0.0f),  // 20
        glm::vec2(1.0f, 0.0f),  // 21
        glm::vec2(1.0f, 1.0f),  // 22
        glm::vec2(0.0f, 1.0f)   // 23
    };

    // 原始索引
    const std::vector<unsigned int> indices = {
            // 前面
            0, 1, 2,
            2, 3, 0,

            // 后面
            5, 4, 7,
            7, 6, 5,

            // 左面
            8, 9, 10,
            10, 11, 8,

            // 右面
            13, 12, 15,
            15, 14, 13,

            // 下面
            16, 17, 18,
            18, 19, 16,

            // 上面
            20, 21, 22,
            22, 23, 20
    };

    m_CubeFaces = {
        // 前面
        glm::uvec3(0, 1, 2),
        glm::uvec3(2, 3, 0),

        // 后面
        glm::uvec3(5, 4, 7),
        glm::uvec3(7, 6, 5),

        // 左面
        glm::uvec3(8, 9, 10),
        glm::uvec3(10, 11, 8),

        // 右面
        glm::uvec3(13, 12, 15),
        glm::uvec3(15, 14, 13),

        // 下面
        glm::uvec3(16, 17, 18),
        glm::uvec3(18, 19, 16),

        // 上面
        glm::uvec3(20, 21, 22),
        glm::uvec3(22, 23, 20)
    };

    m_CubeNormals = {
        // 前面 (0, 0, 1)
        glm::vec3(0.0f, 0.0f, 1.0f),  // 0
        glm::vec3(0.0f, 0.0f, 1.0f),  // 1
        glm::vec3(0.0f, 0.0f, 1.0f),  // 2
        glm::vec3(0.0f, 0.0f, 1.0f),  // 3

        // 后面 (0, 0, -1)
        glm::vec3(0.0f, 0.0f, -1.0f), // 4
        glm::vec3(0.0f, 0.0f, -1.0f), // 5
        glm::vec3(0.0f, 0.0f, -1.0f), // 6
        glm::vec3(0.0f, 0.0f, -1.0f), // 7

        // 左面 (-1, 0, 0)
        glm::vec3(-1.0f, 0.0f, 0.0f), // 8
        glm::vec3(-1.0f, 0.0f, 0.0f), // 9
        glm::vec3(-1.0f, 0.0f, 0.0f), // 10
        glm::vec3(-1.0f, 0.0f, 0.0f), // 11

        // 右面 (1, 0, 0)
        glm::vec3(1.0f, 0.0f, 0.0f),  // 12
        glm::vec3(1.0f, 0.0f, 0.0f),  // 13
        glm::vec3(1.0f, 0.0f, 0.0f),  // 14
        glm::vec3(1.0f, 0.0f, 0.0f),  // 15

        // 下面 (0, -1, 0)
        glm::vec3(0.0f, -1.0f, 0.0f), // 16
        glm::vec3(0.0f, -1.0f, 0.0f), // 17
        glm::vec3(0.0f, -1.0f, 0.0f), // 18
        glm::vec3(0.0f, -1.0f, 0.0f), // 19

        // 上面 (0, 1, 0)
        glm::vec3(0.0f, 1.0f, 0.0f),  // 20
        glm::vec3(0.0f, 1.0f, 0.0f),  // 21
        glm::vec3(0.0f, 1.0f, 0.0f),  // 22
        glm::vec3(0.0f, 1.0f, 0.0f)   // 23
    };

    if (EngineApp.isGLInited()) {
        BaseGeometry::initVAO();
        getVAO()->bind();
        BaseGeometry::initEBO(indices, GL_STATIC_DRAW);
        BaseGeometry::setPos(0, m_CubeVertices);
        BaseGeometry::setCol(1, m_CubeColors);
        BaseGeometry::setUV(2, m_CubeTexCoords);
        BaseGeometry::setNormal(3, m_CubeNormals);
        getVAO()->unbind();
    }
}


Cube::Cube(float cubeWidth, glm::vec3 cubeCenter, glm::vec4 cols) {
    DEFAULT_COL = cols;
        m_DrawMode = GL_TRIANGLES;
    m_GeometryType = GeometryType::TRIANGLE;
    m_DrawType = DrawType::DRAW_ELEMENTS;
    m_IndicesCount = 36;
    m_CubeWidth = cubeWidth;

    float halfSize = 0.5f * cubeWidth;

    m_CubeVertices = {
            // 前面
            glm::vec3(-halfSize, -halfSize,  halfSize),  // 0
            glm::vec3( halfSize, -halfSize,  halfSize),  // 1
            glm::vec3( halfSize,  halfSize,  halfSize),  // 2
            glm::vec3(-halfSize,  halfSize,  halfSize),  // 3

            // 后面
            glm::vec3(-halfSize, -halfSize, -halfSize),  // 4
            glm::vec3( halfSize, -halfSize, -halfSize),  // 5
            glm::vec3( halfSize,  halfSize, -halfSize),  // 6
            glm::vec3(-halfSize,  halfSize, -halfSize),  // 7

            // 左面
            glm::vec3(-halfSize, -halfSize, -halfSize),  // 8
            glm::vec3(-halfSize, -halfSize,  halfSize),  // 9
            glm::vec3(-halfSize,  halfSize,  halfSize),  // 10
            glm::vec3(-halfSize,  halfSize, -halfSize),  // 11

            // 右面
            glm::vec3( halfSize, -halfSize, -halfSize),  // 12
            glm::vec3( halfSize, -halfSize,  halfSize),  // 13
            glm::vec3( halfSize,  halfSize,  halfSize),  // 14
            glm::vec3( halfSize,  halfSize, -halfSize),  // 15

            // 下面
            glm::vec3(-halfSize, -halfSize, -halfSize),  // 16
            glm::vec3( halfSize, -halfSize, -halfSize),  // 17
            glm::vec3( halfSize, -halfSize,  halfSize),  // 18
            glm::vec3(-halfSize, -halfSize,  halfSize),  // 19

            // 上面
            glm::vec3(-halfSize,  halfSize, -halfSize),  // 20
            glm::vec3( halfSize,  halfSize, -halfSize),  // 21
            glm::vec3( halfSize,  halfSize,  halfSize),  // 22
            glm::vec3(-halfSize,  halfSize,  halfSize)   // 23
    };

    for (int i = 0; i < m_CubeVertices.size(); i++) {
        m_CubeVertices[i] += cubeCenter;
    }

    m_CubeColors = {
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,

        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,

        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,

        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,

        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,

        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,

        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
        DEFAULT_COL, DEFAULT_COL, DEFAULT_COL,
    };

    m_CubeTexCoords = {
        // 前面
        glm::vec2(0.0f, 0.0f),  // 0
        glm::vec2(1.0f, 0.0f),  // 1
        glm::vec2(1.0f, 1.0f),  // 2
        glm::vec2(0.0f, 1.0f),  // 3

        // 后面
        glm::vec2(0.0f, 0.0f),  // 4
        glm::vec2(1.0f, 0.0f),  // 5
        glm::vec2(1.0f, 1.0f),  // 6
        glm::vec2(0.0f, 1.0f),  // 7

        // 左面
        glm::vec2(0.0f, 0.0f),  // 8
        glm::vec2(1.0f, 0.0f),  // 9
        glm::vec2(1.0f, 1.0f),  // 10
        glm::vec2(0.0f, 1.0f),  // 11

        // 右面
        glm::vec2(0.0f, 0.0f),  // 12
        glm::vec2(1.0f, 0.0f),  // 13
        glm::vec2(1.0f, 1.0f),  // 14
        glm::vec2(0.0f, 1.0f),  // 15

        // 下面
        glm::vec2(0.0f, 0.0f),  // 16
        glm::vec2(1.0f, 0.0f),  // 17
        glm::vec2(1.0f, 1.0f),  // 18
        glm::vec2(0.0f, 1.0f),  // 19

        // 上面
        glm::vec2(0.0f, 0.0f),  // 20
        glm::vec2(1.0f, 0.0f),  // 21
        glm::vec2(1.0f, 1.0f),  // 22
        glm::vec2(0.0f, 1.0f)   // 23
    };

    // 原始索引
    const std::vector<unsigned int> indices = {
            // 前面
            0, 1, 2,
            2, 3, 0,

            // 后面
            5, 4, 7,
            7, 6, 5,

            // 左面
            8, 9, 10,
            10, 11, 8,

            // 右面
            13, 12, 15,
            15, 14, 13,

            // 下面
            16, 17, 18,
            18, 19, 16,

            // 上面
            20, 21, 22,
            22, 23, 20
    };

    m_CubeFaces = {
        // 前面
        glm::uvec3(0, 1, 2),
        glm::uvec3(2, 3, 0),

        // 后面
        glm::uvec3(5, 4, 7),
        glm::uvec3(7, 6, 5),

        // 左面
        glm::uvec3(8, 9, 10),
        glm::uvec3(10, 11, 8),

        // 右面
        glm::uvec3(13, 12, 15),
        glm::uvec3(15, 14, 13),

        // 下面
        glm::uvec3(16, 17, 18),
        glm::uvec3(18, 19, 16),

        // 上面
        glm::uvec3(20, 21, 22),
        glm::uvec3(22, 23, 20)
    };

    m_CubeNormals = {
        // 前面 (0, 0, 1)
        glm::vec3(0.0f, 0.0f, 1.0f),  // 0
        glm::vec3(0.0f, 0.0f, 1.0f),  // 1
        glm::vec3(0.0f, 0.0f, 1.0f),  // 2
        glm::vec3(0.0f, 0.0f, 1.0f),  // 3

        // 后面 (0, 0, -1)
        glm::vec3(0.0f, 0.0f, -1.0f), // 4
        glm::vec3(0.0f, 0.0f, -1.0f), // 5
        glm::vec3(0.0f, 0.0f, -1.0f), // 6
        glm::vec3(0.0f, 0.0f, -1.0f), // 7

        // 左面 (-1, 0, 0)
        glm::vec3(-1.0f, 0.0f, 0.0f), // 8
        glm::vec3(-1.0f, 0.0f, 0.0f), // 9
        glm::vec3(-1.0f, 0.0f, 0.0f), // 10
        glm::vec3(-1.0f, 0.0f, 0.0f), // 11

        // 右面 (1, 0, 0)
        glm::vec3(1.0f, 0.0f, 0.0f),  // 12
        glm::vec3(1.0f, 0.0f, 0.0f),  // 13
        glm::vec3(1.0f, 0.0f, 0.0f),  // 14
        glm::vec3(1.0f, 0.0f, 0.0f),  // 15

        // 下面 (0, -1, 0)
        glm::vec3(0.0f, -1.0f, 0.0f), // 16
        glm::vec3(0.0f, -1.0f, 0.0f), // 17
        glm::vec3(0.0f, -1.0f, 0.0f), // 18
        glm::vec3(0.0f, -1.0f, 0.0f), // 19

        // 上面 (0, 1, 0)
        glm::vec3(0.0f, 1.0f, 0.0f),  // 20
        glm::vec3(0.0f, 1.0f, 0.0f),  // 21
        glm::vec3(0.0f, 1.0f, 0.0f),  // 22
        glm::vec3(0.0f, 1.0f, 0.0f)   // 23
    };

    if (EngineApp.isGLInited()) {
        BaseGeometry::initVAO();
        getVAO()->bind();
        BaseGeometry::initEBO(indices, GL_STATIC_DRAW);
        BaseGeometry::setPos(0, m_CubeVertices);
        BaseGeometry::setCol(1, m_CubeColors);
        BaseGeometry::setUV(2, m_CubeTexCoords);
        BaseGeometry::setNormal(3, m_CubeNormals);
        getVAO()->unbind();
    }
}